break;
case PROP_ITEM:
- g_value_set_object (value, self->item);
+ if (self->owner)
+ g_value_set_object (value, gtk_list_item_widget_get_item (self->owner));
break;
case PROP_POSITION:
- g_value_set_uint (value, self->position);
+ if (self->owner)
+ g_value_set_uint (value, gtk_list_item_widget_get_position (self->owner));
+ else
+ g_value_set_uint (value, GTK_INVALID_LIST_POSITION);
break;
case PROP_SELECTABLE:
break;
case PROP_SELECTED:
- g_value_set_boolean (value, self->selected);
+ if (self->owner)
+ g_value_set_boolean (value, gtk_list_item_widget_get_selected (self->owner));
+ else
+ g_value_set_boolean (value, FALSE);
break;
default:
{
g_return_val_if_fail (GTK_IS_LIST_ITEM (self), NULL);
- return self->item;
+ if (self->owner == NULL)
+ return NULL;
+
+ return gtk_list_item_widget_get_item (self->owner);
}
/**
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ITEM]);
}
-void
-gtk_list_item_set_item (GtkListItem *self,
- gpointer item)
-{
- g_return_if_fail (GTK_IS_LIST_ITEM (self));
- g_return_if_fail (item == NULL || G_IS_OBJECT (item));
-
- if (self->item == item)
- return;
-
- g_clear_object (&self->item);
- if (item)
- self->item = g_object_ref (item);
-
- g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ITEM]);
-}
-
/**
* gtk_list_item_get_position:
* @self: a #GtkListItem
guint
gtk_list_item_get_position (GtkListItem *self)
{
- g_return_val_if_fail (GTK_IS_LIST_ITEM (self), 0);
-
- return self->position;
-}
-
-void
-gtk_list_item_set_position (GtkListItem *self,
- guint position)
-{
- g_return_if_fail (GTK_IS_LIST_ITEM (self));
-
- if (self->position == position)
- return;
+ g_return_val_if_fail (GTK_IS_LIST_ITEM (self), GTK_INVALID_LIST_POSITION);
- self->position = position;
+ if (self->owner == NULL)
+ return GTK_INVALID_LIST_POSITION;
- g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_POSITION]);
+ return gtk_list_item_widget_get_position (self->owner);
}
/**
{
g_return_val_if_fail (GTK_IS_LIST_ITEM (self), FALSE);
- return self->selected;
-}
-
-void
-gtk_list_item_set_selected (GtkListItem *self,
- gboolean selected)
-{
- g_return_if_fail (GTK_IS_LIST_ITEM (self));
-
- if (self->selected == selected)
- return;
-
- self->selected = selected;
+ if (self->owner == NULL)
+ return FALSE;
- g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED]);
+ return gtk_list_item_widget_get_selected (self->owner);
}
/**
#include "gtklistitemfactoryprivate.h"
#include "gtklistitemprivate.h"
#include "gtkmain.h"
+#include "gtkselectionmodel.h"
#include "gtkwidget.h"
#include "gtkwidgetprivate.h"
{
GtkListItemFactory *factory;
GtkListItem *list_item;
+
+ GObject *item;
+ guint position;
+ gboolean selected;
};
enum
{
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
- if (!priv->list_item->activatable)
+ if (priv->list_item && !priv->list_item->activatable)
return;
gtk_widget_activate_action (GTK_WIDGET (self),
"list.activate-item",
"u",
- priv->list_item->position);
+ priv->position);
}
static gboolean
gtk_list_item_factory_teardown (priv->factory, self);
g_assert (priv->list_item == NULL);
}
+ g_clear_object (&priv->item);
g_clear_object (&priv->factory);
G_OBJECT_CLASS (gtk_list_item_widget_parent_class)->dispose (object);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
gboolean modify, extend;
- if (!priv->list_item->selectable)
+ if (priv->list_item && !priv->list_item->selectable)
return;
g_variant_get (parameter, "(bb)", &modify, &extend);
gtk_widget_activate_action (GTK_WIDGET (self),
"list.select-item",
"(ubb)",
- priv->list_item->position, modify, extend);
+ priv->position, modify, extend);
}
static void
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
GtkWidget *widget = GTK_WIDGET (self);
- if (!priv->list_item->selectable && !priv->list_item->activatable)
+ if (priv->list_item && !priv->list_item->selectable && !priv->list_item->activatable)
{
gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_DENIED);
return;
}
- if (priv->list_item->selectable)
+ if (!priv->list_item || priv->list_item->selectable)
{
GdkModifierType state;
GdkEvent *event;
gtk_widget_activate_action (GTK_WIDGET (self),
"list.select-item",
"(ubb)",
- priv->list_item->position, modify, extend);
+ priv->position, modify, extend);
}
- if (priv->list_item->activatable)
+ if (!priv->list_item || priv->list_item->activatable)
{
if (n_press == 2)
{
gtk_widget_activate_action (GTK_WIDGET (self),
"list.activate-item",
"u",
- priv->list_item->position);
+ priv->position);
}
}
gtk_widget_activate_action (widget,
"list.scroll-to-item",
"u",
- priv->list_item->position);
+ priv->position);
}
static void
if (list_item->child)
gtk_list_item_widget_add_child (self, list_item->child);
+
+ if (priv->item)
+ g_object_notify (G_OBJECT (list_item), "item");
+ if (priv->position != GTK_INVALID_LIST_POSITION)
+ g_object_notify (G_OBJECT (list_item), "position");
+ if (priv->selected)
+ g_object_notify (G_OBJECT (list_item), "selected");
}
void
if (list_item->child)
gtk_list_item_widget_remove_child (self, list_item->child);
+
+ if (priv->item)
+ g_object_notify (G_OBJECT (list_item), "item");
+ if (priv->position != GTK_INVALID_LIST_POSITION)
+ g_object_notify (G_OBJECT (list_item), "position");
+ if (priv->selected)
+ g_object_notify (G_OBJECT (list_item), "selected");
}
void
gpointer item,
gboolean selected)
{
- gtk_list_item_set_item (list_item, item);
- gtk_list_item_set_position (list_item, position);
- gtk_list_item_set_selected (list_item, selected);
+ GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
+
+ /* FIXME: It's kinda evil to notify external objects from here... */
+
+ if (g_set_object (&priv->item, item))
+ g_object_notify (G_OBJECT (list_item), "item");
+
+ if (priv->position != position)
+ {
+ priv->position = position;
+ g_object_notify (G_OBJECT (list_item), "position");
+ }
+
+ if (priv->selected != selected)
+ {
+ priv->selected = selected;
+ g_object_notify (G_OBJECT (list_item), "selected");
+ }
}
void
{
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
- return priv->list_item->position;
+ return priv->position;
}
gpointer
{
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
- return priv->list_item->item;
+ return priv->item;
}
gboolean
{
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
- return priv->list_item->selected;
+ return priv->selected;
}